package ru.susu.algebra.partition.operation;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import ru.susu.algebra.operation.IOperation;
import ru.susu.algebra.partition.Partition;
import ru.susu.algebra.partition.PartitionsFactory;

/**
 * @author akargapolov
 * @since: 04.06.2009
 */
public class ChangePartitionElementOperation implements IOperation<Partition>
{
	/**
	 * На входе разбиение и 2 целых числа. Первое - номер элемента, второе - что
	 * добавить.
	 */
	@Override
	public Partition performOperation(Object... sources)
	{
		Partition partition = (Partition) sources[0];
		Integer index = (Integer) sources[1];
		Integer add = (Integer) sources[2];
		List<Integer> tmp = new ArrayList<Integer>();
		Collections.addAll(tmp, partition.getArrayRepresentation());
		if (index == tmp.size())
		{
			tmp.add(add);
		}
		else if (index < 0)
		{
			tmp.add(0, add);
		}
		else
		{
			tmp.set(index, tmp.get(index) + add);
		}
		Collections.sort(tmp);

		while(!tmp.isEmpty() && tmp.get(0).equals(Integer.valueOf(0)))
			tmp.remove(0);

		return PartitionsFactory.createPartition(tmp.toArray(new Integer[tmp.size()]));
	}

}
